package com.demandbreakdown.xiyun.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.stp.StpUtil;
import com.demandbreakdown.xiyun.common.annotation.ApiLog;
import com.demandbreakdown.xiyun.common.base.Result;
import com.demandbreakdown.xiyun.common.base.ResultUtils;
import com.demandbreakdown.xiyun.model.dto.auth.ResetPasswordDTO;
import com.demandbreakdown.xiyun.model.dto.user.UserQueryDTO;
import com.demandbreakdown.xiyun.model.dto.user.UserStatusUpdateDTO;
import com.demandbreakdown.xiyun.model.dto.user.UserUpdateDTO;
import com.demandbreakdown.xiyun.model.vo.common.PageVO;
import com.demandbreakdown.xiyun.model.vo.user.UserVO;
import com.demandbreakdown.xiyun.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * 用户管理控制器
 *
 * @author poxz
 */
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
@Tag(name = "用户管理", description = "用户信息管理相关接口")
public class UserController {

    private final UserService userService;

    /**
     * 获取当前用户详情
     */
    @ApiLog("获取当前用户详情")
    @Operation(summary = "获取当前用户详情", description = "获取当前登录用户的详细信息")
    @GetMapping("/me")
    @SaCheckLogin
    public Result<UserVO> getCurrentUser() {
        UserVO userVO = userService.getCurrentUser();
        return ResultUtils.success(userVO);
    }

    /**
     * 修改个人资料
     */
    @ApiLog("修改个人资料")
    @Operation(summary = "修改个人资料", description = "修改当前用户的个人资料")
    @PutMapping("/me")
    @SaCheckLogin
    public Result<UserVO> updateProfile(@Valid @RequestBody UserUpdateDTO userUpdateDTO) {
        Long userId = StpUtil.getLoginIdAsLong();
        UserVO userVO = userService.updateProfile(userId, userUpdateDTO);
        return ResultUtils.success(userVO);
    }

    /**
     * 重置密码
     */
    @ApiLog(value = "重置密码", desensitize = true)
    @Operation(summary = "重置密码", description = "已登录用户通过旧密码修改密码，成功后踢出全部设备")
    @PutMapping("/me/password")
    @SaCheckLogin
    public Result<Void> resetPassword(@Valid @RequestBody ResetPasswordDTO resetPasswordDTO) {
        Long userId = StpUtil.getLoginIdAsLong();
        userService.resetPassword(userId, resetPasswordDTO);
        return ResultUtils.success();
    }

    /**
     * 后台-分页查询用户（管理员）
     */
    @ApiLog("分页查询用户")
    @Operation(summary = "分页查询用户", description = "管理员分页查询用户列表")
    @GetMapping("/list")
    @SaCheckRole("admin")
    public Result<PageVO<UserVO>> getUsers(UserQueryDTO userQueryDTO) {
        PageVO<UserVO> pageVO = userService.getUsers(userQueryDTO);
        return ResultUtils.success(pageVO);
    }

    /**
     * 后台-根据用户ID获取用户信息（管理员）
     */
    @ApiLog("根据ID获取用户信息")
    @Operation(summary = "根据用户ID获取用户信息", description = "管理员根据用户ID查询用户详细信息")
    @GetMapping("/{id}")
    @SaCheckRole("admin")
    public Result<UserVO> getUserById(@Parameter(description = "用户ID", required = true) @PathVariable Long id) {
        UserVO userVO = userService.getUserById(id);
        return ResultUtils.success(userVO);
    }

    /**
     * 后台-修改用户状态（管理员）
     */
    @ApiLog("修改用户状态")
    @Operation(summary = "修改用户状态", description = "管理员修改用户状态，禁用后立即踢人")
    @PatchMapping("/{id}/status")
    @SaCheckRole("admin")
    public Result<Void> updateUserStatus(
            @Parameter(description = "用户ID", required = true) @PathVariable Long id,
            @Valid @RequestBody UserStatusUpdateDTO userStatusUpdateDTO) {
        userService.updateUserStatus(id, userStatusUpdateDTO);
        return ResultUtils.success();
    }
}